﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SegIdenPC.Entidad;
using log4net;
using SegIdenPC.Herramientas;
using GS1.Utilitario;

namespace SegIdenPC.Formularios
{
    public partial class frmDevoluciones : Form
    {
        #region --- Variables y Propiedades ---
        private static readonly ILog log = LogManager.GetLogger(typeof(frmDevoluciones));

        private const string TITULO = "Generar Venta";

        public Cliente clienteFormulario { get; set; }

        public ListaItem listaItemFormulario { get; set; }

        public bool formularioDevolucionImportada { get; set; }

        public Prestamo prestamoFormulario { get; set; } //OJO

        private Guia guia = new Guia();

        private ListaLineaGuia listaLineaGuia = new ListaLineaGuia();


        private Cliente clienteActual = null;

        #endregion

        #region --- Constructor ---
        public frmDevoluciones()
        {
            InitializeComponent();
        }
        #endregion
        #region --- Eventos Formulario ---
        private void frmDevoluciones_Load(object sender, EventArgs e)
        {
           cargarFormulario();
        }

        private void tbtnGrabar_Click(object sender, EventArgs e)
        {
           grabar();
        }

        private void tbtnSalir_Click(object sender, EventArgs e)
        {
           salir();
        }
        private void btnEliminar_Click(object sender, EventArgs e)
        {
            quitarItem();
        }

        #endregion

          #region --- Metodos Propios ---

        
       private void cargarFormulario()
        {
            ListaGeneral listaTipoDocumento = null;

            try
            {
                Cursor.Current = Cursors.WaitCursor;

                // Instanciando y creando listado de documentos
                listaTipoDocumento = new ListaGeneral();
                listaTipoDocumento.Add(new General { codigo = Constantes.CODIGO_TIPO_DOCUMENTO_DNI, descripcion = Constantes.DESCRIPCION_TIPO_DOCUMENTO_DNI });
                listaTipoDocumento.Add(new General { codigo = Constantes.CODIGO_TIPO_DOCUMENTO_RUC, descripcion = Constantes.DESCRIPCION_TIPO_DOCUMENTO_RUC });
                listaTipoDocumento.Add(new General { codigo = Constantes.CODIGO_TIPO_DOCUMENTO_CE, descripcion = Constantes.DESCRIPCION_TIPO_DOCUMENTO_CE });
                listaTipoDocumento.Add(new General { codigo = Constantes.CODIGO_TIPO_DOCUMENTO_CI, descripcion = Constantes.DESCRIPCION_TIPO_DOCUMENTO_CI });

                // Estableciendo parametros del combo Tipo documento
                this.cboTipoDocumento.DataSource = listaTipoDocumento;
                this.cboTipoDocumento.ValueMember = Constantes.GENERAL_CODIGO;
                this.cboTipoDocumento.DisplayMember = Constantes.GENERAL_DESCRIPCION;
                this.cboTipoDocumento.SelectedIndex = 0;

                this.txtClienteNroDocumento.Focus();


                    this.clienteActual = this.clienteFormulario;
                    this.cboTipoDocumento.Text = this.clienteActual.tipoDocumento;
                    this.txtClienteNroDocumento.Text = this.clienteActual.nroDocumento;
                    this.txtClienteRazonSocial.Text = this.clienteActual.razonSocial;

                    // Se establece propiedad para evitar que genere nuevas columnas que no estan mapeadas en la grilla
                    this.dgvListadoItemsSeleccionados.AutoGenerateColumns = false;
                    //Listado temporal para poder cambiar el estado de los items
                    ListPersonalizada<Item> listaItemsSeleccion = new ListPersonalizada<Item>();

                    foreach (Item itemFormulario in this.listaItemFormulario.lista)
                    {
                        itemFormulario.estado = Constantes.ESTADO_ITEM_DISPONIBLE;  //Cambia de estado de frmMantPrestamo a FrmDevoluciones
                        listaItemsSeleccion.Add(itemFormulario);
                    }
                    // Actualizando en grilla
                    this.dgvListadoItemsSeleccionados.DataSource = null;
                    this.dgvListadoItemsSeleccionados.DataSource = listaItemsSeleccion;

                    pintarGrilla(this.dgvListadoItemsSeleccionados);

            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
            finally
            {
                Cursor.Current = Cursors.Default;
            }
        }

         private void pintarGrilla(DataGridView grilla)
         {
             ListPersonalizada<Item> listaItems = null;
             listaItems = (ListPersonalizada<Item>)grilla.DataSource;

             if (listaItems != null)
             {
                 for (int i = 0; i < listaItems.Count; i++)
                 {
                     var item = listaItems[i];
                     grilla.Rows[i].Cells[2].Value = item.producto.codProductoProveedor;
                     grilla.Rows[i].Cells[3].Value = item.producto.descripcion;
                     switch (item.estado)
                     {
                         case Constantes.ESTADO_ITEM_DE_BAJA:
                             {
                                 grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_DE_BAJA;
                                 break;
                             }
                         case Constantes.ESTADO_ITEM_DE_TRANSITO:
                             {
                                 grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_DE_TRANSITO;
                                 break;
                             }
                         case Constantes.ESTADO_ITEM_DESUNIDO:
                             {
                                 grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_DESUNIDO;
                                 break;
                             }
                         case Constantes.ESTADO_ITEM_DISPONIBLE:
                             {
                                 grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_DISPONIBLE;
                                 break;
                             }
                         case Constantes.ESTADO_ITEM_EN_BULTO:
                             {
                                 grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_EN_BULTO;
                                 break;
                             }
                         case Constantes.ESTADO_ITEM_ENTREGADO:
                             {
                                 grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_ENTREGADO;
                                 break;
                             }
                         case Constantes.ESTADO_ITEM_MANTENIMIENTO:
                             {
                                 grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_MANTENIMIENTO;
                                 break;
                             }
                         case Constantes.ESTADO_ITEM_PRESTAMO:
                             {
                                 grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_PRESTAMO;
                                 break;
                             }
                         case Constantes.ESTADO_ITEM_RECEPCION_PARCIAL:
                             {
                                 grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_RECEPCION_PARCIAL;
                                 break;
                             }
                         case Constantes.ESTADO_ITEM_SEPARADO:
                             {
                                 grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_SEPARADO;
                                 break;
                             }
                         case Constantes.ESTADO_ITEM_UNIDO:
                             {
                                 grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_UNIDO;
                                 break;
                             }
                         case Constantes.ESTADO_ITEM_VENDIDO:
                             {
                                 grilla.Rows[i].Cells[4].Value = Constantes.ESTADO_ITEM_DESCRIPCION_VENDIDO;
                                 break;
                             }
                     }
                 }
             }
         }

                 //Valida si el item ya fue vendido

                /* if (validarItemVendido(itemSeleccionado.codItem))
                 {
                     Libreria.CampoNecesario(this.dgvListadoItemsSeleccionadosMas, "Este ya se encuentra vendido", TITULO);
                     return;
                 }*/

                
       /*  private bool validarItemVendido(string codItem)
         {
             bool resultato = false;

             // Obteniendo lista de items seleccionados
             ListPersonalizada<Item> listaItemsSeleccion = (ListPersonalizada<Item>)this.dgvListadoItemsSeleccionados.DataSource;

             if (listaItemsSeleccion != null)
             {
                 foreach (Item item in listaItemsSeleccion)
                 {
                     if (item.codItem.Equals(codItem))
                     {
                         resultato = true;
                         break;
                     }
                 }
             }

             return resultato;
         }*/

         private void quitarItem()
         {
            ListPersonalizada<Item> listaItemsSeleccion = null;
             try
             {
              listaItemsSeleccion = (ListPersonalizada<Item>)this.dgvListadoItemsSeleccionados.DataSource;

                 if (listaItemsSeleccion != null && listaItemsSeleccion.Count > 0)
                 {
                     // Item Seleccionado
                     Item itemSeleccionado = listaItemsSeleccion[this.dgvListadoItemsSeleccionados.CurrentRow.Index];

                     listaItemsSeleccion.Remove(itemSeleccionado);

                     // Actualizando en grilla
                     this.dgvListadoItemsSeleccionados.DataSource = null;
                     this.dgvListadoItemsSeleccionados.DataSource = listaItemsSeleccion;

                     pintarGrilla(this.dgvListadoItemsSeleccionados);

                 }
             }
             catch (Exception ex)
             {
                 log.Error(ex.Message, ex);
                 Libreria.MensajeError(ex, TITULO);
             }
         }

         private bool validarEntrada()
         {
           /*  this.txtSerie.Text = this.txtSerie.Text.Trim();
             this.txtNumero.Text = this.txtNumero.Text.Trim();
             this.txtClienteRazonSocial.Text = this.txtClienteRazonSocial.Text.Trim();

             if (this.txtSerie.Text.Equals(string.Empty))
             {
                 Libreria.CampoNecesario(this.txtSerie, "Debe ingresar el campo Serie", TITULO);
                 return true;
             }

             if (this.txtNumero.Text.Equals(string.Empty))
             {
                 Libreria.CampoNecesario(this.txtNumero, "Debe ingresar el campo Número", TITULO);
                 return true;
             }*/

             ListPersonalizada<Item> listaItemsSeleccion = (ListPersonalizada<Item>)this.dgvListadoItemsSeleccionados.DataSource;

             if ((listaItemsSeleccion == null) || (listaItemsSeleccion.Count == 0))
             {
                 Libreria.CampoNecesario(this.dgvListadoItemsSeleccionados, "Debe ingresar por lo menos un Item", TITULO);
                 return true;
             }

             return false;
         }

            
        private void grabar()
         {
             Operacion operacion = null;
             string contenidoXML = string.Empty;

             try
             {
                 if (validarEntrada()) { return; }

                 //ActualizarItem();

                 LineaGuia lineaGuia = null;

                 foreach (Item itemGuia in (ListPersonalizada<Item>)this.dgvListadoItemsSeleccionados.DataSource)
                 {
                     LineaGuiaItem lineaGuiaItem = new LineaGuiaItem();
                     lineaGuiaItem.item = new Item();
                     // Se establece el codigo de barra del item
                     lineaGuiaItem.item = itemGuia;
                     lineaGuiaItem.item.estado = Constantes.ESTADO_ITEM_DISPONIBLE;

                     lineaGuia = new LineaGuia();
                     lineaGuia.producto = itemGuia.producto;
                     lineaGuia.cantidad = Constantes.VALOR_CERO;

                     lineaGuia.listaLineaGuiaItem = new ListaLineaGuiaItem();

                     // Agregando al listado de guia item
                     lineaGuia.listaLineaGuiaItem.add(lineaGuiaItem);

                     // Se agrega linea de guia
                     this.listaLineaGuia.add(lineaGuia);      
                 }
      
                 // Solicitar confirmacion
                 if (!Libreria.ShowMessageboxPregunta("¿Estas seguro de registrar la Devolución?", TITULO)) { return; }

                 // Estableciendo operacion a ser enviada al Servicio REST
                 operacion = new Operacion();
                 operacion.numero = Constantes.OPERACION_REGISTRAR_GUIA_DOCUMENTO;//OPERACION_REGISTRAR_GUIA_DOCUMENTO; 

                this.guia.codGuia = Constantes.VALOR_CERO;

               // this.guia.serie = this.txtSerie.Text;
               // this.guia.numero = this.txtNumero.Text;

                this.guia.tiendaDestino = new Tienda();
                this.guia.tiendaDestino.codigo = ParametrosAplicacion.TIENDA_ACTUAL.codigo;

                // Estableciendo tipo de guia
                this.guia.tipoGuia = new TipoGuia();
                this.guia.tipoGuia.codigo = Constantes.CODIGO_TIPO_GUIA_ELECTRONICA;

                this.guia.fechaRecepcion = DateTime.Now.ToString(Constantes.FORMATO_FECHAHORA);

                this.guia.estado = Constantes.ESTADO_DOCUMENTO_DEVUELTO;

                this.guia.listaLineaGuia = listaLineaGuia;

                //Prestamo
                //this.guia.prestamo = new Prestamo();
                //this.guia.prestamo = this.prestamoFormulario;

                operacion.guia = this.guia;

                 // Instanciando y ejecutando llamada al ServicioREST
                 ConexionREST conexionREST = new ConexionREST();
                 contenidoXML = conexionREST.ejecutarOperacion(operacion);

                 // Obteniendo Objeto de Error
                 OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                 // Validar si hay error
                 if (operacionError != null)
                 {
                     Libreria.ShowMessageboxError(operacionError.descripcion);
                     return;
                 }

                 OperacionResultado operacionResultado = contenidoXML.DeserializarTo<OperacionResultado>();

                 if ((operacionResultado != null) &&
                     (operacionResultado.esOK.Equals(Constantes.SI)))
                 {
                     //this.txtCodigo.Text = operacionResultado.codigoGenerado;
                     Libreria.ShowMessageboxInfo("Devolución guardada correctamente", TITULO);
                 }
                 else
                 {
                     Libreria.ShowMessageboxError("No se guardo los datos", TITULO);
                     return;
                 }
                 this.dgvListadoItemsSeleccionados.Enabled = false;
                 this.tbtnGrabar.Enabled = false;
             }
             catch (Exception ex)
             {
                 log.Error(ex.Message, ex);
                 Libreria.MensajeError(ex, TITULO);
             }
         }

        /* private void ActualizarItem()
        {
 
            
            Operacion operacion = null;
            string contenidoXML = string.Empty;

            try
            {
                ListPersonalizada<Item> listaItemsSeleccionMas = (ListPersonalizada<Item>)this.dgvListadoItemsSeleccionados.DataSource;
                if (listaItemsSeleccionMas != null)
                {
                   foreach (Item item in listaItemsSeleccionMas)
                   {
                       // Estableciendo operacion a ser enviada al Servicio REST
                    operacion = new Operacion();
                    operacion.numero = Constantes.OPERACION_ACTUALIZAR_ESTADO_ITEM;

                    operacion.item = new Item();
                    operacion.item.codItem = item.codItem;
                    operacion.item.estado = Constantes.ESTADO_ITEM_DISPONIBLE;

                   }
                }

                // Instanciando y ejecutando llamada al ServicioREST
                ConexionREST conexionREST = new ConexionREST();
                contenidoXML = conexionREST.ejecutarOperacion(operacion);

                // Obteniendo Objeto de Error
                OperacionError operacionError = contenidoXML.DeserializarTo<OperacionError>();

                // Validar si hay error
                if (operacionError != null)
                {
                    Libreria.ShowMessageboxError(operacionError.descripcion);
                    return;
                }

                OperacionResultado operacionResultado = contenidoXML.DeserializarTo<OperacionResultado>();

                if ((operacionResultado != null) &&
                    (operacionResultado.esOK.Equals(Constantes.SI)))
                {
                    //this.txtCodigo.Text = operacionResultado.codigoGenerado;
                }
                else
                {
                    return;
                }

                // Estableciendo los estados de los botones
                this.tbtnGrabar.Enabled = false;
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                Libreria.MensajeError(ex, TITULO);
            }
        }*/

        private void salir()
        {
            this.Close();
        }

         #endregion
        

         

         private void txtNumero_TextChanged(object sender, EventArgs e)
         {

         }

         private void cboTipoDocumento_SelectedIndexChanged(object sender, EventArgs e)
         {

         }

         private void btnBuscarCliente_Click(object sender, EventArgs e)
         {

         }

      

  


    }
}
